package jvm;

public class Test01 {
    public static void main(String[] args) {
        Test01 test01 = new Test01();
        Object object = new Object();
        /*
        类加载器的分类
        启动类加载器：Bootstrap Class Loader  $JAVAHOME/jre/lib/tr.jar
        扩展类加载器：Extension Class Loader/ExtClassLoader      $JAVAHOME/jre/lib/ext/*.jar
        系统/应用类加载器：System Class Loader   $CLASSPATH
             AppClassLoader
        自定义类加载器

        双亲委派机制：当一个类收到类加载请求时，他首先不会尝试自己去加载这个类，而是把这个请求委派给父类去完成，
        每一层次类加载器都是如此，因此所有的加载请求都应该传送到启动类加载器其中，
        只有父类加载器反馈自己无法完成这个请求时（在其所在地路径下没有找到所需加载的Class
        子类加载器才会尝试自己去加载。
        采用双亲委派的一个好处就比如加载位于rt.jar包中的类，java.lang.Object,
        不管是哪一个加载器加载这个类，最终都会委托给顶层的启动类加载器进行加载。
        这样保证了使用不同的类加载器最终得到的都是同样一个Object对象。
         */
        System.out.println(test01.getClass().getClassLoader().getParent().getParent());// null
        System.out.println(test01.getClass().getClassLoader().getParent());//sun.misc.Launcher$ExtClassLoader@1b6d3586
        System.out.println(test01.getClass().getClassLoader());// sun.misc.Launcher$AppClassLoader@18b4aac2

        //System.out.println(object.getClass().getClassLoader().getParent().getParent());//NullPointException
        //System.out.println(object.getClass().getClassLoader().getParent());//NullPointException
        System.out.println(object.getClass().getClassLoader());//null

    }
}
